{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1、基于远景平台导出数据的日前电价预测模型baseline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true,
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "只采用市场收集到的竞价空间数据作为输入的原始特征，并辅以日期特征，对日前电价进行预测。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-23T02:17:30.125046Z",
     "start_time": "2022-04-23T02:17:26.723475Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "import datetime\n",
    "import warnings\n",
    "import inspect\n",
    "\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "from math import factorial\n",
    "\n",
    "from sklearn.ensemble import RandomForestRegressor\n",
    "from sklearn.metrics import mean_absolute_percentage_error, mean_squared_error\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from scipy.signal import savgol_filter\n",
    "warnings.filterwarnings('ignore')\n",
    "plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-23T02:55:16.659412Z",
     "start_time": "2022-04-23T02:55:16.646865Z"
    },
    "code_folding": [
     1,
     11
    ]
   },
   "outputs": [],
   "source": [
    "# utility functions\n",
    "def filtered_mape(y_true: list, y_pred: list):\n",
    "    \"\"\"为了使mape的值更加合理，过滤掉其中的0值\"\"\"\n",
    "    y_true_filtered, y_pred_filtered = [], []\n",
    "    for i in range(len(y_true)):\n",
    "        if y_true[i] != 0:\n",
    "            y_true_filtered.append(y_true[i])\n",
    "            y_pred_filtered.append(y_pred[i])\n",
    "    return mean_absolute_percentage_error(y_true_filtered, y_pred_filtered)\n",
    "\n",
    "\n",
    "def plot_and_compare(y_true: list, y_pred: list, y_compare: list, timestamp: pd.Series,\n",
    "                     start_index: int, end_index: int = -1, single_day: bool = False\n",
    "                    ):\n",
    "    \"\"\"\n",
    "    可视化两类预测结果与真实结果的曲线。\n",
    "    \n",
    "    Parameters\n",
    "    ----------\n",
    "    y_true: 真实值列表\n",
    "    y_pred: 预测值列表\n",
    "    y_compare: 对比的预测值列表\n",
    "    timestamp: 日期索引组成的序列\n",
    "    start_index: 待绘制数据的起始索引，整数，最小为0\n",
    "    end_index: 待绘制的数据的终止索引，整数，默认为最后一个\n",
    "    single_day: 布尔值，是否取一天的数据，如果为True，则end_index参数失效且start_index表示天的索引\n",
    "    \n",
    "    \"\"\"\n",
    "    \n",
    "    for key in loc:\n",
    "        if loc[key] is y_true:\n",
    "            label1 = key\n",
    "        if loc[key] is y_pred:\n",
    "            label2 = key\n",
    "        if loc[key] is y_compare:\n",
    "            label3 = key\n",
    "\n",
    "#     assert len(y_true) == len(y_pred) == len(y_compare) == len(timestamp), '数据/时间戳列表必须具有相同的长度'\n",
    "    if single_day:\n",
    "        if len(y_true) <= 96:\n",
    "            warnings.warn('所有数据不足一整天！')\n",
    "            start_index = 0\n",
    "            end_index = -1\n",
    "        else:\n",
    "            if len(y_true) % 96 == 0:\n",
    "                assert start_index < len(y_true) // 96\n",
    "            else:\n",
    "                assert start_index <= len(y_true) // 96\n",
    "            end_index = min((start_index + 1)*96, len(y_true))\n",
    "            start_index *= 96\n",
    "            \n",
    "    if y_true is not None:\n",
    "        y_true_ = y_true[start_index: end_index]\n",
    "    if y_pred is not None:\n",
    "        y_pred_ = y_pred[start_index: end_index]\n",
    "    if y_compare is not None:\n",
    "        y_compare_ = y_compare[start_index: end_index]\n",
    "    x = timestamp.iloc[start_index: end_index]\n",
    "    \n",
    "    plt.xlabel('日期 时刻')\n",
    "    plt.xticks(rotation=45)\n",
    "    if y_true is not None:\n",
    "        plt.plot(x, y_true_, label=label1, color='green')\n",
    "    if y_pred is not None:\n",
    "        plt.plot(x, y_pred_, label=label2, color='red')\n",
    "    if y_compare is not None:\n",
    "        plt.plot(x, y_compare_, label=label3, color='blue')\n",
    "    plt.legend()\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-21T07:36:20.805261Z",
     "start_time": "2022-04-21T07:36:19.440477Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# 原始数据读入\n",
    "ori_df = pd.read_excel('./data/远景平台导出数据/日前信息_2022-03-01至2022-03-31.xlsx')\n",
    "\n",
    "# 对时间戳字段进行处理\n",
    "timestamp = ori_df['时间戳']\n",
    "timestamp = timestamp.map(lambda i: i.replace('24:00', '00:00'))\n",
    "timestamp = pd.to_datetime(timestamp)\n",
    "\n",
    "index = timestamp[timestamp.map(lambda i: i.hour == 0 and i.minute == 0)].index\n",
    "timestamp[index] = timestamp[index].map(lambda i: i+datetime.timedelta(1))\n",
    "\n",
    "# 数据过滤\n",
    "df = ori_df[['竞价空间-日前（MW）', '缩减前统一结算点电价-日前（元/MWh）']]\n",
    "df.columns = ['x', 'y']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# 数据可视化探索部分\n",
    "fig, ax1 = plt.subplots()\n",
    "fig.autofmt_xdate(rotation=45)\n",
    "ax1.plot(timestamp, df['x'], label='竞价空间')\n",
    "ax2 = ax1.twinx()\n",
    "ax2.plot(timestamp, df['y'], label='日前结算点电价', color='red')\n",
    "\n",
    "ax1.legend(loc='upper left')\n",
    "ax1.set_ylabel('MW')\n",
    "ax1.set_ylim(0, max(df['x']))\n",
    "\n",
    "ax2.legend(loc='upper right')\n",
    "ax2.set_ylabel('元/MWh')\n",
    "ax2.set_ylim(0, max(df['y']))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-21T07:36:22.861282Z",
     "start_time": "2022-04-21T07:36:22.844005Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# 对日期/时刻数据进行处理，作为新的特征加入模型\n",
    "# 1. 按照是否为出力高峰，增加一列特征。处理高峰时间段：10时到15时\n",
    "# 2. 增加周一~周日的特征\n",
    "# 3. 增加是否为周末的特征\n",
    "values = []\n",
    "weekday = []\n",
    "is_weekend = []\n",
    "for t in timestamp:\n",
    "    if 10 <= t.hour <= 15:\n",
    "        values.append(1)\n",
    "    else:\n",
    "        values.append(0)\n",
    "\n",
    "    wd = t.weekday()\n",
    "    weekday.append(wd)\n",
    "    if wd in [5, 6]:\n",
    "        is_weekend.append(1)\n",
    "    else:\n",
    "        is_weekend.append(0)\n",
    "\n",
    "df.loc[:, 'x1'] = values\n",
    "df.loc[:, 'x2'] = weekday\n",
    "df.loc[:, 'x3'] = is_weekend"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-21T07:36:25.072677Z",
     "start_time": "2022-04-21T07:36:25.068213Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# 训练集、测试集划分\n",
    "train_size = int(df.shape[0] * .8)\n",
    "train_df = df.iloc[:train_size, :]\n",
    "test_df = df.iloc[train_size:, :]\n",
    "train_timestamp, test_timestamp = timestamp.iloc[:train_size], timestamp.iloc[train_size:]\n",
    "# 远景预测结果\n",
    "yj_pred = ori_df['缩减前节点电价-日前预测（元/MWh）'].iloc[train_size:].tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-21T07:30:41.549019Z",
     "start_time": "2022-04-21T07:30:15.931144Z"
    },
    "collapsed": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best parameters set found on development set:\n",
      "\n",
      "{'criterion': 'absolute_error', 'max_features': 'auto', 'n_estimators': 20}\n",
      "\n",
      "Grid scores on development set:\n",
      "\n",
      "-42770538064175024.000 (+/-91918629493159232.000) for {'criterion': 'squared_error', 'max_features': 'auto', 'n_estimators': 10}\n",
      "-40602170271989952.000 (+/-86490264092123584.000) for {'criterion': 'squared_error', 'max_features': 'auto', 'n_estimators': 20}\n",
      "-41124588301832112.000 (+/-88717397855365296.000) for {'criterion': 'squared_error', 'max_features': 'auto', 'n_estimators': 40}\n",
      "-42918485096471656.000 (+/-89786536736684832.000) for {'criterion': 'squared_error', 'max_features': 'sqrt', 'n_estimators': 10}\n",
      "-42052741866590968.000 (+/-92623726840597392.000) for {'criterion': 'squared_error', 'max_features': 'sqrt', 'n_estimators': 20}\n",
      "-42290431636672320.000 (+/-91490629976940720.000) for {'criterion': 'squared_error', 'max_features': 'sqrt', 'n_estimators': 40}\n",
      "-41295503219161144.000 (+/-91595879414431088.000) for {'criterion': 'squared_error', 'max_features': 'log2', 'n_estimators': 10}\n",
      "-42193274989921176.000 (+/-90480305432782752.000) for {'criterion': 'squared_error', 'max_features': 'log2', 'n_estimators': 20}\n",
      "-41140138020293424.000 (+/-90735014706052768.000) for {'criterion': 'squared_error', 'max_features': 'log2', 'n_estimators': 40}\n",
      "-35610764575568936.000 (+/-86938195784000688.000) for {'criterion': 'absolute_error', 'max_features': 'auto', 'n_estimators': 10}\n",
      "-31596294186173088.000 (+/-72021532584682592.000) for {'criterion': 'absolute_error', 'max_features': 'auto', 'n_estimators': 20}\n",
      "-34526358810965344.000 (+/-76815088144095760.000) for {'criterion': 'absolute_error', 'max_features': 'auto', 'n_estimators': 40}\n",
      "-35085406433154920.000 (+/-82895566096488720.000) for {'criterion': 'absolute_error', 'max_features': 'sqrt', 'n_estimators': 10}\n",
      "-35685628877231784.000 (+/-75034346351837840.000) for {'criterion': 'absolute_error', 'max_features': 'sqrt', 'n_estimators': 20}\n",
      "-35801051357702696.000 (+/-83384538225130112.000) for {'criterion': 'absolute_error', 'max_features': 'sqrt', 'n_estimators': 40}\n",
      "-38017336834935648.000 (+/-70995922367056760.000) for {'criterion': 'absolute_error', 'max_features': 'log2', 'n_estimators': 10}\n",
      "-33977820849418796.000 (+/-80999243853304512.000) for {'criterion': 'absolute_error', 'max_features': 'log2', 'n_estimators': 20}\n",
      "-36619044368319976.000 (+/-83677427479948848.000) for {'criterion': 'absolute_error', 'max_features': 'log2', 'n_estimators': 40}\n",
      "-42486022786379968.000 (+/-87182319215327952.000) for {'criterion': 'poisson', 'max_features': 'auto', 'n_estimators': 10}\n",
      "-41259750316479616.000 (+/-83569482909574704.000) for {'criterion': 'poisson', 'max_features': 'auto', 'n_estimators': 20}\n",
      "-41166459189748128.000 (+/-84737718358419952.000) for {'criterion': 'poisson', 'max_features': 'auto', 'n_estimators': 40}\n",
      "-42109337069251312.000 (+/-89534552487760304.000) for {'criterion': 'poisson', 'max_features': 'sqrt', 'n_estimators': 10}\n",
      "-42912401197638232.000 (+/-89995527098883872.000) for {'criterion': 'poisson', 'max_features': 'sqrt', 'n_estimators': 20}\n",
      "-43674298572307952.000 (+/-86499871777161856.000) for {'criterion': 'poisson', 'max_features': 'sqrt', 'n_estimators': 40}\n",
      "-42930967298042800.000 (+/-84404961950788288.000) for {'criterion': 'poisson', 'max_features': 'log2', 'n_estimators': 10}\n",
      "-43287399788749328.000 (+/-87470569192044512.000) for {'criterion': 'poisson', 'max_features': 'log2', 'n_estimators': 20}\n",
      "-43679181657353144.000 (+/-87528500632074512.000) for {'criterion': 'poisson', 'max_features': 'log2', 'n_estimators': 40}\n"
     ]
    }
   ],
   "source": [
    "# 网格搜索确定最优参数\n",
    "# 使用网格搜索选择最优参数\n",
    "fea_cols = ['x', 'x1', 'x3',]\n",
    "score = 'neg_mean_absolute_percentage_error'\n",
    "tuned_parameters = {'n_estimators': [10, 20, 40],\n",
    "                    'criterion': ['squared_error', 'absolute_error', 'poisson'],\n",
    "                    'max_features': ['auto', 'sqrt', 'log2'],\n",
    "                    }\n",
    "rf = GridSearchCV(RandomForestRegressor(), tuned_parameters, scoring=score)\n",
    "rf.fit(train_df[fea_cols], train_df['y'])\n",
    "print(\"Best parameters set found on development set:\")\n",
    "print()\n",
    "print(rf.best_params_)\n",
    "print()\n",
    "print(\"Grid scores on development set:\")\n",
    "print()\n",
    "means = rf.cv_results_[\"mean_test_score\"]\n",
    "stds = rf.cv_results_[\"std_test_score\"]\n",
    "for mean, std, params in zip(means, stds, rf.cv_results_[\"params\"]):\n",
    "    print(\"%0.3f (+/-%0.03f) for %r\" % (mean, std * 2, params))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-21T07:36:35.172027Z",
     "start_time": "2022-04-21T07:36:34.808087Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# 建模及预测\n",
    "# x: 竞价空间\n",
    "# x1: 是否出力高峰\n",
    "# x2: 工作日顺序\n",
    "# x3: 是否周末\n",
    "#\n",
    "# ['x', 'x1', 'x3']时，mse超过远景；\n",
    "# ['x', 'x3']时，mape超过远景；\n",
    "# ['x', 'x2']时，mape超过远景；\n",
    "# ['x', 'x2', 'x3']时，mape超过远景；\n",
    "\n",
    "fea_cols = ['x', 'x1', 'x3',]\n",
    "rfr = RandomForestRegressor(n_estimators=10, criterion='absolute_error', random_state=123)\n",
    "rfr.fit(train_df[fea_cols], train_df['y'])\n",
    "pred = rfr.predict(test_df[fea_cols])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-21T07:36:36.260137Z",
     "start_time": "2022-04-21T07:36:36.236050Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "(MSE) Our model:  10496.943090939598\n",
      "(MSE) Yuanjing's model:  9349.717033221477\n",
      "\n",
      "(MAPE) Our model:  3.1692488833856154\n",
      "(MAPE) Yuanjing's model:  7.31933422861464\n"
     ]
    }
   ],
   "source": [
    "# 模型评估\n",
    "# 1. MSE\n",
    "y_true = test_df['y'].tolist()\n",
    "our_pred = list(pred.round(2))\n",
    "yj_pred = yj_pred\n",
    "print()\n",
    "print('(MSE) Our model: ', mean_squared_error(y_true, our_pred))\n",
    "print('(MSE) Yuanjing\\'s model: ', mean_squared_error(y_true, yj_pred))\n",
    "\n",
    "# 2. MAPE\n",
    "# 在计算MAPE前，首先将真实值为0的那些样本去掉，否则会导致极大的偏差\n",
    "y_true_filtered = []\n",
    "our_pred_filtered = []\n",
    "yj_pred_filtered = []\n",
    "keep_index = []\n",
    "for i in range(test_df.shape[0]):\n",
    "    if test_df['y'].iloc[i] != 0:\n",
    "        keep_index.append(i)\n",
    "        y_true_filtered.append(y_true[i])\n",
    "        our_pred_filtered.append(pred[i])\n",
    "        yj_pred_filtered.append(yj_pred[i])\n",
    "print()\n",
    "print('(MAPE) Our model: ', mean_absolute_percentage_error(y_true_filtered, our_pred_filtered))\n",
    "print('(MAPE) Yuanjing\\'s model: ', mean_absolute_percentage_error(y_true_filtered, yj_pred_filtered))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-21T08:08:36.334972Z",
     "start_time": "2022-04-21T08:08:36.176882Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 对预测的数据结果进行可视化查看\n",
    "# 定义数据的起止索引\n",
    "loc = locals()\n",
    "plot_and_compare(y_true, our_pred, None, test_timestamp, 2, single_day=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "heading_collapsed": true
   },
   "source": [
    "# 2、优化测试"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hidden": true
   },
   "source": [
    "## 2.1 对原始数据进行归一化处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-21T07:33:25.566745Z",
     "start_time": "2022-04-21T07:33:25.560146Z"
    },
    "hidden": true
   },
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import MinMaxScaler\n",
    "\n",
    "scaler = MinMaxScaler()\n",
    "df['x'] = scaler.fit_transform(df['x'].values.reshape(-1, 1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-21T07:33:27.585765Z",
     "start_time": "2022-04-21T07:33:27.571586Z"
    },
    "collapsed": true,
    "hidden": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "      <th>x1</th>\n",
       "      <th>x2</th>\n",
       "      <th>x3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.519081</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.519346</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.516084</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.515020</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.515994</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          x    y  x1  x2  x3\n",
       "0  0.519081  0.0   0   1   0\n",
       "1  0.519346  0.0   0   1   0\n",
       "2  0.516084  0.0   0   1   0\n",
       "3  0.515020  0.0   0   1   0\n",
       "4  0.515994  0.0   0   1   0"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hidden": true
   },
   "source": [
    "## 2.2 对baseline结果进行平滑处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-21T08:10:39.716199Z",
     "start_time": "2022-04-21T08:10:39.710330Z"
    },
    "code_folding": [],
    "hidden": true
   },
   "outputs": [],
   "source": [
    "our_pred_hat = savgol_filter(our_pred, 11, 7, mode='wrap')\n",
    "our_pred_hat[our_pred_hat < 0] = 0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-21T08:10:40.241131Z",
     "start_time": "2022-04-21T08:10:40.234547Z"
    },
    "hidden": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3.0597161351397597\n",
      "9080.05174504347\n"
     ]
    }
   ],
   "source": [
    "print(filtered_mape(y_true, our_pred_hat))\n",
    "print(mean_squared_error(y_true, our_pred_hat))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-21T08:10:41.225389Z",
     "start_time": "2022-04-21T08:10:41.081919Z"
    },
    "hidden": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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7Q8PwzDK4eWXX6ZBgwYsXLiQX375hX79+pVY/wXg559/ZunSpaXuBzj99NN58cUXeeWVV/jb3/7GuHHjOHToECtXrkRV6dKlC/Pnz6d58+Y888wzvPTSS6gqnTp14r333mPp0qV8/vnnZWoePXo0l19+OY888gjvvfce559/PsOHD2fatGkcPnyYjh078sQTTxw196oaOtRiU/cX9UoZ0o+6734Eq1dD376hFQUu0jhwAE480d169YIKrARuGLWCMiLq6uK7777jzDPPBKBevXr06NGjyBT/whUW27dvX6ahA4wYMQKAAQMG8MEHHwBw4oknApCSksLOnTv57W9/C7j1WYcMGUJGRgYjR44E4NRTTyU2NrbMa5x88skANGvWjB07dtC4cWOWLFnCjBkzaNCgARkZGQG//kCptaGtv/zuru5t3YZg/xSsDIcOwe23w0MPwaWXQr9+4KvrbBhG1fBHzgAZGRl8++23DBky5Gj1xRUrVhw9NpC1Pb/++msAvvzyS3r16lXkvOTkZFq3bs1HH33E/Pnz+dOf/sSZZ55Jz549j2pYvXp1uYtCH6vj1VdfJTExkbfeeot7772XzMxMVLVYdcmqUOsj9Z2N6kBcHKxZE1pBACkp7v755+H002H8eFi3LrSaDCNMuOGGG5g4cSKDBw8mLy+PRx55hISEBG699VZatmxJ69atK9TeK6+8wuOPP05iYiLTpk1j5cqVR/dFRETw3HPPMWbMGPLz80lISOC1115jyJAhjB8/nsGDB9OlSxfi4+MrdM0zzzyTyy67jBUrVnDiiSfSq1cvfv75ZwYMGMA999xDx44d6dKlaks7S8FSozVPv379dPny5ZU6d9uBbbR9ti2vnPsK4ye+CA0bwqefBllhBVmxwkXnH30EY8fCtdfC7Nnw88+h1WUYQeD777+na9euoZZRId577z2ef/75ItsGDx7MokWLjnawVtc1HnnkkSq3DSX/3UVkhar2K+n4WhupF1n9qGdPZ56hxr+QduPG7r5VK9i929Wniaq1f2rDqLVceOGFXHhh8VKuJZXtDfY1QkW5OXURGS8i8323xSJyRESaisjHIvK5iPxHRBJ8x54pIl+JyJcicn11Cq8bU5dIiXTrlPboAbt2QWqxda5LRhXS04Mvyp9+adTI3bds6Ubl7N5d+jmGYdQ48+fPD0qU7kXKNXVV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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "loc = locals()\n",
    "plot_and_compare(y_true, our_pred_hat, None, test_timestamp, 2, single_day=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3、利用风行平台的数据进行测试"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-22T03:15:01.225318Z",
     "start_time": "2022-04-22T03:14:56.459252Z"
    }
   },
   "outputs": [],
   "source": [
    "train_x = pd.read_excel('./data/风行平台（清能互联）/火电竞价空间数据（2021-04-01至2021-12-31）.xlsx')\n",
    "test_x = pd.read_excel('./data/风行平台（清能互联）/火电竞价空间数据（2022-01-01至2022-04-20）.xlsx')\n",
    "y = pd.read_excel('./data/风行平台（清能互联）/统一出清价格数据（2021-04-01至2022-04-20）.xlsx')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-22T03:15:04.640691Z",
     "start_time": "2022-04-22T03:15:04.273498Z"
    }
   },
   "outputs": [],
   "source": [
    "# 时间格式处理\n",
    "timestamp = y['日期'] + ' ' + y['时间']\n",
    "timestamp = timestamp.map(lambda i: i.replace('24:00', '00:00'))\n",
    "timestamp = pd.to_datetime(timestamp)\n",
    "index = timestamp[timestamp.map(lambda i: i.hour == 0 and i.minute == 0)].index\n",
    "timestamp[index] = timestamp[index].map(lambda i: i+datetime.timedelta(1))\n",
    "y['时间戳'] = timestamp\n",
    "\n",
    "timestamp = train_x['日期'] + ' ' + train_x['时间']\n",
    "timestamp = timestamp.map(lambda i: i.replace('24:00', '00:00'))\n",
    "timestamp = pd.to_datetime(timestamp)\n",
    "index = timestamp[timestamp.map(lambda i: i.hour == 0 and i.minute == 0)].index\n",
    "timestamp[index] = timestamp[index].map(lambda i: i+datetime.timedelta(1))\n",
    "train_x['时间戳'] = timestamp\n",
    "\n",
    "timestamp = test_x['日期'] + ' ' + test_x['时间']\n",
    "timestamp = timestamp.map(lambda i: i.replace('24:00', '00:00'))\n",
    "timestamp = pd.to_datetime(timestamp)\n",
    "index = timestamp[timestamp.map(lambda i: i.hour == 0 and i.minute == 0)].index\n",
    "timestamp[index] = timestamp[index].map(lambda i: i+datetime.timedelta(1))\n",
    "test_x['时间戳'] = timestamp"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-22T03:15:07.718791Z",
     "start_time": "2022-04-22T03:15:07.636662Z"
    }
   },
   "outputs": [],
   "source": [
    "values = []\n",
    "weekday = []\n",
    "is_weekend = []\n",
    "for t in train_x['时间戳']:\n",
    "    if 10 <= t.hour <= 15:\n",
    "        values.append(1)\n",
    "    else:\n",
    "        values.append(0)\n",
    "\n",
    "    wd = t.weekday()\n",
    "    weekday.append(wd)\n",
    "    if wd in [5, 6]:\n",
    "        is_weekend.append(1)\n",
    "    else:\n",
    "        is_weekend.append(0)\n",
    "train_x.loc[:, 'x1'] = values\n",
    "train_x.loc[:, 'x2'] = weekday\n",
    "train_x.loc[:, 'x3'] = is_weekend\n",
    "\n",
    "values = []\n",
    "weekday = []\n",
    "is_weekend = []\n",
    "for t in test_x['时间戳']:\n",
    "    if 10 <= t.hour <= 15:\n",
    "        values.append(1)\n",
    "    else:\n",
    "        values.append(0)\n",
    "\n",
    "    wd = t.weekday()\n",
    "    weekday.append(wd)\n",
    "    if wd in [5, 6]:\n",
    "        is_weekend.append(1)\n",
    "    else:\n",
    "        is_weekend.append(0)\n",
    "test_x.loc[:, 'x1'] = values\n",
    "test_x.loc[:, 'x2'] = weekday\n",
    "test_x.loc[:, 'x3'] = is_weekend\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-22T03:15:09.568225Z",
     "start_time": "2022-04-22T03:15:09.563346Z"
    }
   },
   "outputs": [],
   "source": [
    "train_y = y.iloc[:len(train_x), :]\n",
    "test_y = y.iloc[len(train_x):,:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-22T03:15:42.803935Z",
     "start_time": "2022-04-22T03:15:11.517237Z"
    }
   },
   "outputs": [],
   "source": [
    "fea_cols = ['火电竞价空间-日前(MW)', 'x1', 'x3',]\n",
    "rfr = RandomForestRegressor(n_estimators=10, criterion='absolute_error', random_state=123)\n",
    "rfr.fit(train_x[fea_cols], train_y['统一出清价格-日前(元/MWh)'])\n",
    "pred = rfr.predict(test_x[fea_cols])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-22T03:15:46.733916Z",
     "start_time": "2022-04-22T03:15:46.728176Z"
    }
   },
   "outputs": [],
   "source": [
    "fx_pred = test_y['统一出清价格-日前预测'].tolist()\n",
    "y_true = test_y['统一出清价格-日前(元/MWh)'].tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-22T03:26:53.630228Z",
     "start_time": "2022-04-22T03:26:53.603068Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(MSE) Our model:  55442.26379517914\n",
      "(MSE) Fengxing's model:  15533.748070342897\n",
      "\n",
      "(MAPE) Our model:  11.56952744873353\n",
      "(MAPE) Fengxing's model:  14.480812633048332\n"
     ]
    }
   ],
   "source": [
    "print('(MSE) Our model: ', mean_squared_error(y_true, pred))\n",
    "print('(MSE) Fengxing\\'s model: ', mean_squared_error(y_true, fx_pred))\n",
    "\n",
    "y_true_filtered = []\n",
    "our_pred_filtered = []\n",
    "fx_pred_filtered = []\n",
    "keep_index = []\n",
    "for i in range(len(y_true)):\n",
    "    if y_true[i] != 0:\n",
    "        keep_index.append(i)\n",
    "        y_true_filtered.append(y_true[i])\n",
    "        our_pred_filtered.append(pred[i])\n",
    "        fx_pred_filtered.append(fx_pred[i])\n",
    "print()\n",
    "print('(MAPE) Our model: ', mean_absolute_percentage_error(y_true_filtered, our_pred_filtered))\n",
    "print('(MAPE) Fengxing\\'s model: ', mean_absolute_percentage_error(y_true_filtered, fx_pred_filtered))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-22T03:16:14.342514Z",
     "start_time": "2022-04-22T03:16:14.327250Z"
    }
   },
   "outputs": [],
   "source": [
    "# 平滑处理\n",
    "our_pred_hat = savgol_filter(pred, 5, 2, mode='wrap')\n",
    "our_pred_hat[our_pred_hat < 0] = 0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-22T03:16:16.185049Z",
     "start_time": "2022-04-22T03:16:15.988892Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "loc = locals()\n",
    "plot_and_compare(y_true, our_pred_hat, fx_pred, test_x['时间戳'], 66, single_day=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-22T03:16:23.531162Z",
     "start_time": "2022-04-22T03:16:23.517409Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10.97730655604735\n",
      "50843.773131050555\n"
     ]
    }
   ],
   "source": [
    "print('平滑后的mape', filtered_mape(y_true, our_pred_hat))\n",
    "print('平滑后的mse', mean_squared_error(y_true, our_pred_hat))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4、两平台比较\n",
    "比较两个平台的竞价空间的数据对相同的测试集的预测效果。\n",
    "\n",
    "由于远景平台数据有限，测试集选定为**2022年3月25日-2022年3月31日**数据。\n",
    "\n",
    "为避免训练集的规模产生的影响，训练集均选用**2022年3月1日-2022年3月24日**数据。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-23T03:08:58.479780Z",
     "start_time": "2022-04-23T03:08:58.475998Z"
    }
   },
   "outputs": [],
   "source": [
    "train_date_range = pd.date_range('2022-3-1 00:15', '2022-3-24 23:45', freq='15min')  # 远景没有3月1号0点数据\n",
    "test_date_range = pd.date_range('2022-3-25', '2022-3-31 23:45', freq='15min')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-23T03:24:48.611155Z",
     "start_time": "2022-04-23T03:24:47.272995Z"
    }
   },
   "outputs": [],
   "source": [
    "# 远景数据读入与处理\n",
    "# 原始数据读入\n",
    "ori_df = pd.read_excel('./data/远景平台导出数据/日前信息_2022-03-01至2022-03-31.xlsx')\n",
    "\n",
    "# 对时间戳字段进行处理\n",
    "timestamp = ori_df['时间戳']\n",
    "timestamp = timestamp.map(lambda i: i.replace('24:00', '00:00'))\n",
    "timestamp = pd.to_datetime(timestamp)\n",
    "\n",
    "index = timestamp[timestamp.map(lambda i: i.hour == 0 and i.minute == 0)].index\n",
    "timestamp[index] = timestamp[index].map(lambda i: i+datetime.timedelta(1))\n",
    "\n",
    "# 数据过滤\n",
    "yj_df = ori_df[['竞价空间-日前（MW）', '缩减前统一结算点电价-日前（元/MWh）', '缩减前统一结算点电价-日前预测（元/MWh）']]\n",
    "yj_df.columns = ['x', 'y', 'y_hat']\n",
    "yj_df['时间戳'] = timestamp"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-23T03:09:09.280887Z",
     "start_time": "2022-04-23T03:09:05.871338Z"
    }
   },
   "outputs": [],
   "source": [
    "fx_y = pd.read_excel('./data/风行平台（清能互联）/统一出清价格数据（2021-04-01至2022-04-20）.xlsx')\n",
    "date_range = pd.date_range('2022-3-1', '2022-3-31 23:45', freq='15min')\n",
    "\n",
    "timestamp = fx_y['日期'] + ' ' + fx_y['时间']\n",
    "timestamp = timestamp.map(lambda i: i.replace('24:00', '00:00'))\n",
    "timestamp = pd.to_datetime(timestamp)\n",
    "index = timestamp[timestamp.map(lambda i: i.hour == 0 and i.minute == 0)].index\n",
    "timestamp[index] = timestamp[index].map(lambda i: i+datetime.timedelta(1))\n",
    "fx_y['时间戳'] = timestamp\n",
    "fx_y = fx_y[['统一出清价格-日前(元/MWh)', '统一出清价格-日前预测', '时间戳']]\n",
    "fx_y.columns = ['y', 'y_hat', '时间戳']\n",
    "fx_y = fx_y[fx_y['时间戳'].map(lambda i: i in date_range)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-23T03:09:12.791427Z",
     "start_time": "2022-04-23T03:09:12.101575Z"
    },
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "fx_x = pd.read_excel('./data/风行平台（清能互联）/火电竞价空间数据（2022-01-01至2022-04-20）.xlsx')\n",
    "timestamp = fx_x['日期'] + ' ' + fx_x['时间']\n",
    "timestamp = timestamp.map(lambda i: i.replace('24:00', '00:00'))\n",
    "timestamp = pd.to_datetime(timestamp)\n",
    "index = timestamp[timestamp.map(lambda i: i.hour == 0 and i.minute == 0)].index\n",
    "timestamp[index] = timestamp[index].map(lambda i: i+datetime.timedelta(1))\n",
    "fx_x['时间戳'] = timestamp\n",
    "fx_x = fx_x[['火电竞价空间-日前(MW)', '时间戳']]\n",
    "fx_x.columns = ['x', '时间戳']\n",
    "fx_x = fx_x[fx_x['时间戳'].map(lambda i: i in date_range)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-23T03:09:13.631540Z",
     "start_time": "2022-04-23T03:09:13.620728Z"
    }
   },
   "outputs": [],
   "source": [
    "fx_df = pd.merge(fx_x, fx_y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-23T03:09:16.257395Z",
     "start_time": "2022-04-23T03:09:16.249001Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "          x    y                 时间戳\n",
      "0  19901.56  0.0 2022-03-01 00:15:00\n",
      "1  19909.91  0.0 2022-03-01 00:30:00\n",
      "2  19807.07  0.0 2022-03-01 00:45:00\n",
      "3  19773.53  0.0 2022-03-01 01:00:00\n",
      "4  19804.25  0.0 2022-03-01 01:15:00\n",
      "         x                 时间戳      y   y_hat\n",
      "0 -4767.26 2022-03-01 00:00:00  250.0  252.91\n",
      "1 -7703.44 2022-03-01 00:15:00    0.0   47.53\n",
      "2 -7695.09 2022-03-01 00:30:00    0.0   49.05\n",
      "3 -7797.93 2022-03-01 00:45:00    0.0   30.34\n",
      "4 -7831.47 2022-03-01 01:00:00    0.0   24.23\n"
     ]
    }
   ],
   "source": [
    "print(yj_df.head())\n",
    "print(fx_df.head())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-23T02:49:53.588303Z",
     "start_time": "2022-04-23T02:49:53.578393Z"
    },
    "code_folding": [
     0
    ]
   },
   "outputs": [],
   "source": [
    "def gen_fea(ori_df):\n",
    "    values = []\n",
    "    weekday = []\n",
    "    is_weekend = []\n",
    "    for t in ori_df['时间戳']:\n",
    "        if 10 <= t.hour <= 15:\n",
    "            values.append(1)\n",
    "        else:\n",
    "            values.append(0)\n",
    "\n",
    "        wd = t.weekday()\n",
    "        weekday.append(wd)\n",
    "        if wd in [5, 6]:\n",
    "            is_weekend.append(1)\n",
    "        else:\n",
    "            is_weekend.append(0)\n",
    "    ori_df.loc[:, 'x1'] = values\n",
    "    ori_df.loc[:, 'x2'] = weekday\n",
    "    ori_df.loc[:, 'x3'] = is_weekend\n",
    "    return ori_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-23T03:25:00.421725Z",
     "start_time": "2022-04-23T03:25:00.400216Z"
    }
   },
   "outputs": [],
   "source": [
    "yj_df_fea = gen_fea(yj_df)\n",
    "fx_df_fea = gen_fea(fx_df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-23T03:25:01.763479Z",
     "start_time": "2022-04-23T03:25:01.575544Z"
    }
   },
   "outputs": [],
   "source": [
    "yj_train_df = yj_df_fea[yj_df_fea['时间戳'].map(lambda i: i in train_date_range)]\n",
    "yj_test_df = yj_df_fea[yj_df_fea['时间戳'].map(lambda i: i in test_date_range)]\n",
    "\n",
    "fx_train_df = fx_df_fea[fx_df_fea['时间戳'].map(lambda i: i in train_date_range)]\n",
    "fx_test_df = fx_df_fea[fx_df_fea['时间戳'].map(lambda i: i in test_date_range)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-23T03:09:38.564985Z",
     "start_time": "2022-04-23T03:09:37.971494Z"
    }
   },
   "outputs": [],
   "source": [
    "fea_cols = ['x', 'x1', 'x3',]\n",
    "yj_rfr = RandomForestRegressor(n_estimators=10, criterion='absolute_error', random_state=123)\n",
    "yj_rfr.fit(yj_train_df[fea_cols], yj_train_df['y'])\n",
    "yj_pred = yj_rfr.predict(yj_test_df[fea_cols])\n",
    "\n",
    "fx_rfr = RandomForestRegressor(n_estimators=10, criterion='absolute_error', random_state=123)\n",
    "fx_rfr.fit(fx_train_df[fea_cols], fx_train_df['y'])\n",
    "fx_pred = fx_rfr.predict(fx_test_df[fea_cols])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-04-23T03:27:44.061924Z",
     "start_time": "2022-04-23T03:27:44.052053Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "远景预测结果：\n",
      "our model: 4.722618806968158\n",
      "远景 model: 6.606027568519771\n",
      "\n",
      "风行预测结果：\n",
      "our model: 58.30167584743849\n",
      "风行 model: 29.338681427989147\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(\n",
    "f\"\"\"远景预测结果：\n",
    "our model: {filtered_mape(yj_test_df['y'].tolist(), yj_pred)}\n",
    "远景 model: {filtered_mape(yj_test_df['y'].tolist(), yj_test_df['y_hat'].tolist())}\n",
    "\n",
    "风行预测结果：\n",
    "our model: {filtered_mape(fx_test_df['y'].tolist(), fx_pred)}\n",
    "风行 model: {filtered_mape(fx_test_df['y'].tolist(), fx_test_df['y_hat'].tolist())}\n",
    "\n",
    "\"\"\"\n",
    ")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.11"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": false,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}